import axios from 'axios';
import qs from 'qs'; // 将对象序列化成URL的形式，以&进行拼接
import productionUrl from './env';
import { Message } from 'element-ui'
// 线上版本用 baseUrl
let baseUrl = process.env.NODE_ENV === 'production' ? productionUrl : '';

const instance = axios.create({
  baseURL: baseUrl,
  withCredentials: true,
  timeout: 20000,
});

// request 拦截器,序列化请求数据，视服务端的要求
instance.interceptors.request.use(
  (config) => {

    let token = localStorage.getItem('token')
    config.headers['Authorization'] ='Token '+token;
    // Tip: 1
    // 请求开始的时候可以结合 vuex 开启全屏的 loading 动画
    // Tip: 2
    // 带上 token , 可以结合 vuex 或者重 localStorage

    //  获取cookie 中的 token
    // let token = getCookie('token')
    // let test = document.cookie.split(';')
    // console.log('test', test)
    // let token = test.split('=')[1]

    // if (token) {
    //      config.headers['csrftoken'] = token
    //   //    = getToken() // 让每个请求携带token--['X-Token']为自定义key 请根据实际情况自行修改
    //   // }
    // }
    //  else {
    //   // 重定向到登录页面
    // }
    // Tip: 3
    // 根据请求方法，序列化传来的参数，根据后端需求是否序列化
    // debugger
    // console.log(">>>>>>>>>>>>>productionUrl", productionUrl)
    if (config.headers["Content-Type"] !== "application/json;charset=UTF-8" && config.headers["Content-Type"] !== "multipart/form-data") {
     
      config.data = qs.stringify(config.data);
      
    }
    console.log(config,'!!!!!!!!!!!!!!!!!!!!!!')
    return config;
  },
  (error) => {
    // 请求错误时做些事(接口错误、超时等)
    // Tip: 4
    // 关闭loadding
    console.log('request:', error);
    // 1.判断请求超时
    if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
      console.log(
        '根据你设置的timeout/真的请求超时 判断请求现在超时了，你可以在这里加入超时的处理方案',
      );
      // return service.request(originalRequest);//例如再重复请求一次
    }
    // 2.需要重定向到错误页面
    const errorInfo = error.response;
    console.log(errorInfo);
    if (errorInfo) {
      // error =errorInfo.data//页面那边catch的时候就能拿到详细的错误信息,看最下边的Promise.reject
      // const errorStatus = errorInfo.status; // 404 403 500 ... 等
      // router.push({
      //   path: `/error/${errorStatus}`
      // });
    }
    return Promise.reject(error); // 在调用的那边可以拿到(catch)你想返回的错误信息
  },
);

// 处理来自网络或者服务器的错误
instance.interceptors.response.use(
  (response) => {
    //  获取响应头中的 token

    // console.log('response:！！！！！！！！！！！！！！！！！！！', response);



    // Tip: 5
    // IE9时response.data是undefined，因此需要使用response.request.responseText(Stringify后的字符串)
    let data = response.data || response.request.responseText;
    // 根据返回的code值来做不同的处理（和后端约定）
    // switch (data.code) {
    //   case '':
    //     break;
    //   default:
    // }
    // 当code为500，token失效，返回登录
    if (data.code == '401') {
      alert('用户认证失败, 退回登录!');
      localStorage.clear(); // 退出清除所有的localStorage
      // let isParentLocationHref = window.parent.location.href;
      // if (isParentLocationHref) {
      //   let parentLocationHref = isParentLocationHref.split('#')[0];
      //   window.parent.location.href = parentLocationHref;
      // } else {
      //   let locationHref = window.location.href.split('#')[0];
      //   window.location.href = locationHref;
      // }
    }
    // 若不是正确的返回code，且已经登录，就抛出错误
    // const err = new Error(data.description)
    // err.data = data
    // err.response = response
    // throw err
    return data;
  },
  (error) => {
    if (error && error.response) {
      //  全局提示错误信息 
      switch (error.response.status) {
        case 400:
          error.message = '请求错误';
          // 谈一个提示框 ，，，，
          break;
        case 401: {
          error.message = '未授权，请登录';
          localStorage.clear(); // 退出清除所有的localStorage
          let isParentLocationHref = window.parent.location.href;
          if (isParentLocationHref) {
            let parentLocationHref = isParentLocationHref.split('#')[0];
            window.parent.location.href = parentLocationHref;
          } else {
            let locationHref = window.location.href.split('#')[0];
            window.location.href = locationHref;
          }
        }
        break;
        case 403:
          error.message = '拒绝访问';
          Message.error(error.response.data.detail);
        break;

      case 404:
        // 全局设置 
        error.message = `请求地址出错: ${error.response.config.url}`;
        break;

      case 408:
        error.message = '请求超时';
        break;

      case 500:
        error.message = '服务器内部错误';
        break;

      case 501:
        error.message = '服务未实现';
        break;

      case 502:
        error.message = '网关错误';
        break;

      case 503:
        error.message = '服务不可用';
        break;

      case 504:
        error.message = '网关超时';
        break;

      case 505:
        error.message = 'HTTP版本不受支持';
        break;

      default:
        error.message = `连接错误${error.response.status}`;
      }

    }
    console.error(error);
    // 此处可以使用 element UI 的提示组件
    // Message.error(`ERROR: ${error}`);
    return Promise.reject(error); // 返回接口返回的错误信息
  },
);

/**
 * 封装axios 请求
 * @param url url地址
 * @param data  传到后台的参数
 * @param method 请求类型,默认使用get
 * @param opts  {} 对象格式。自定义配置项，该参数中的值会覆盖前面的值
 * @returns {Promise<any>}
 */
function $axios(url = '', data = {}, method = 'GET', opts = {}) {
  // console.log(opts);
  // let authorization;
  return new Promise((resolve, reject) => {
    let newData = {};
    Object.assign(newData, data); // 合并自定义配置
    let isFormData = false
    if (opts.headers && opts.headers['Content-Type'] == 'multipart/form-data') {
      isFormData = true
    } else {
      isFormData = false
    }
    let type = method.toLocaleLowerCase();
    let isDataProp = type === 'post' || type === 'put' || type === 'patch'; // `data` 作为请求主体发送的数据, 仅适用于请求方法“PUT”，“POST”和“PATCH”

    // console.log(newData);
    let options = {
      url: `${url}`,
      method: method,
      params: !isDataProp ? newData : {},
      data: isDataProp ? isFormData ? data : newData : {},
      responseType: 'json',
      traditional: true,
      timeout: opts.timeout || instance.timeout,
      headers: {
        ...opts.headers,
      } || {
        'Cookie': '', // 设置cookie为一个空字符串
        // 设置默认请求头
        Accept: 'application/json',
        // Authorization: authorization,
        // 'Content-Type': 'application/json',
        // 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
      },
    };

    // 清除掉 cookie

    console.log('options', options,opts);

    Object.assign(options, opts); // 合并自定义配置

    instance(options)
      .then((response) => {
        resolve(response);
      })
      .catch((error) => {
        reject(error);
      });
  });
}

export default $axios;